package cn.edu.tjufe.llp.tin.dto.common;

import lombok.Getter;
import lombok.Setter;

/**
 * Restful返回的消息
 * @param <T>
 */
@Getter
@Setter
public class Rs<T> {
    /**
     * 成功状态
     * @ignore
     */
    private static final int CODE_SUCCESS = 0;
    /**
     * 成功状态
     * @ignore
     */
    private static final String MSG_SUCCESS = "业务处理成功";
    /**
     * 失败状态码
     * @ignore
     */
    private static final int CODE_FAIL = -1;
    /**
     * 失败状态码
     * @ignore
     */
    private static final String MSG_FAIL = "业务处理失败";
    
    /**
     * 消息状态码
     */
    private int code;

    /**
     * 消息内容
     */
    private String message;

    /**
     * 数据。
     * 失败时为null, 或详细的错误信息。例如：输入验证时，可能有多个输入参数错误，多条详细的错误信息。
     * 
     */
    private T data;

    /**
     * 总记录数(只有分页的时候用得到)
     */
    private int total;

	public Rs() {
		super();
	}    
    
    /**
     * 初始化一个新创建的 R 对象
     *
     * @param code 状态码
     * @param message  返回内容
     * @param data 数据对象
     */
    public Rs(int code, String message, T data, int total) {
        this.code = code;
        this.message = message;
        this.data = data;
        this.total = total;
    }
    
    /**
     * 初始化一个新创建的 R 对象
     *
     * @param code 状态码
     * @param message  返回内容
     * @param data 数据对象
     */
    public Rs(int code, String message, T data) {
    	this(code, message, data, 0);
    }
    
    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static <T> Rs<T> success(String message, T data, int total) {
    	return new Rs<T>(CODE_SUCCESS, message, data, total);
    }
    
    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static <T> Rs<T> success(T data, int total) {
    	return new Rs<T>(CODE_SUCCESS, MSG_SUCCESS, data, total);
    }

    
    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static <T> Rs<T> success(T data) {
    	return new Rs<T>(CODE_SUCCESS, MSG_SUCCESS, data, 0);
    }
    
    /**
     * 返回失败消息
     *
     * @return 成功消息
     */
    public static <T> Rs<T> fail(int code, String message, T data) {
    	return new Rs<T>(code, message, data, 0);
    }
    
    /**
     * 返回失败消息
     *
     * @return 失败消息
     */
    public static <T> Rs<T> fail(int code, String message) {
    	return new Rs<T>(code, message, null, 0);
    }

    /**
     * 返回失败消息
     *
     * @return 失败消息
     */
    public static <T> Rs<T> fail() {
    	return new Rs<T>(CODE_FAIL, MSG_FAIL, null, 0);
    }

}
